﻿using System.Collections.Generic;
using System.Data;
using Library.Cache;
using Library.Persistence.Cloud;
using Library.Util;

namespace Library.Cloud.Cache
{
    public class CloudParametreCache : CacheObject
    {
        public CloudParametreCache()
        {
            Name = "CloudParametreCache";

            if (Key == null)
                Key = new object();

            if (CacheManager.HasCacheObject(Name)) 
                return;
            lock (Key)
            {
                if (!CacheManager.HasCacheObject(Name))
                {                    
                    LoadCacheObject();
                }
            }
        }

        private static CloudDao CloudDao()
        {
            return CloudDaoFactory.CloudDao();
        }

        private void LoadCacheObject()
        {            
            CacheManager.SetCacheObject(Name, DataUtil.ListToDataTable(CloudDao().CloudParametre().FindAll()));            
        }

        private List<CloudParametre> FilterCacheObject(string filter, string order)
        {
            // Cache'den nesne alınır.
            var dt = CacheManager.GetCacheObject(Name);

            // İstediğimiz filtreleme yapılır.
            var dataRows = dt.Select(filter, order);
            if (dataRows.Length == 0)
                return null;

            // Filtrelenmiş sonuç DataTable nesnesine aktarılır.
            // Array döndürecekse ImportRow döngü içerisinde kullanılabilir.
            var filteredDt = new DataTable();
            for (var i = 0; i < dt.Columns.Count; i++)
                filteredDt.Columns.Add(dt.Columns[i].Caption, dt.Columns[i].DataType);

            foreach (var dataRow in dataRows)
                filteredDt.ImportRow(dataRow);

            return DataUtil.DataTableToList<CloudParametre>(filteredDt);
        }

        public CloudParametre FindByTabloAdiAndKodu(string tabloAdi, string kodu)
        {
            var filter = "tabloAdi = '" + tabloAdi + "' AND kodu = '" + kodu + "' and aktif = 'E'";
            const string order = "";
            var cacheObjectList = FilterCacheObject(filter, order);
            if (cacheObjectList != null && cacheObjectList.Count > 0)
                return cacheObjectList[0];
            return null;
        }

        public List<CloudParametre> FindByTabloAdi(string tabloAdi)
        {
            var filter = "tabloAdi = '" + tabloAdi + "' AND aktif = 'E'";
            const string order = "sira ASC";
            return FilterCacheObject(filter, order);
        }

        public List<CloudParametre> FindByTabloAdiAndKoduLike(string tabloAdi, string kodu)
        {
            var filter = "tabloAdi = '" + tabloAdi + "' AND kodu LIKE '" + kodu + "%' and aktif = 'E'";
            const string order = "sira ASC";
            return FilterCacheObject(filter, order);
        }
    }
}
